package com.ds.seqlist.LeetCode;

import java.util.Deque;
import java.util.LinkedList;


/**
 * @author Dianzhi Han
 * @version 1.0
 * @description: 双队列实现栈
 * @date 2022/9/5 22:55
 */
public class Num225_ImplementStacksWithQueues {
    private Deque<Integer> queue1;
    private Deque<Integer> queue2;
    private Deque<Integer> temp;

    public Num225_ImplementStacksWithQueues() {
        queue1=new LinkedList<>();
        queue2=new LinkedList<>();

    }

    public void push(int x) {
        queue2.offer(x); //q2为辅助栈
        //1.queue1永远是保存元素的队列（已逆序），新元素直接入queue2，然后从queue1中出队再入队queue2中
        while (!queue1.isEmpty()){
            queue2.offer(queue1.poll());
        }
        //2.交换queue1和queue2的引用
        temp=queue1;
        queue1=queue2;
        queue2=temp;
    }

    public int pop() {
        return queue1.poll();
    }

    public int top() {
        return queue1.peek();
    }

    public boolean empty() {
        return queue1.isEmpty();
    }
}


//单队列实现栈
class MyStack {
    private Deque<Integer> queque;
    private int length=0;//1.先记录一下栈此时的元素个数
    public MyStack() {
        queque=new LinkedList<>();
    }

    public void push(int x) {
        queque.offer(x);//2.新元素直接入队
        //3.把新元素之前的元素挨个出队再入队，此时最新的元素就是队头元素
        for (int i=0;i<length;i++){
            queque.offer(queque.poll());
        }
        length++;

    }

    public int pop() {
        length--;
        return queque.poll();

    }

    public int top() {
        return queque.peek();
    }

    public boolean empty() {
        return queque.isEmpty();
    }
}
